• Jump To … +
    zoo_frontend/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js zoo_frontend/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.js zoo_frontend/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.min.js zoo_frontend/node_modules/hoist-non-react-statics/src/index.js zoo_frontend/pages/_app.jsx zoo_frontend/pages/_document.jsx zoo_frontend/pages/admin/delivery-containers/index.js zoo_frontend/pages/admin/department/index.js zoo_frontend/pages/admin/group-diets/index.js zoo_frontend/pages/admin/species/index.js zoo_frontend/pages/admin/user/index.js zoo_frontend/pages/diet/edit.js zoo_frontend/pages/diet/index.js zoo_frontend/pages/diet/new.js zoo_frontend/pages/food/dataSrc.js zoo_frontend/pages/food/edit.js zoo_frontend/pages/food/index.js zoo_frontend/pages/food/new.js zoo_frontend/pages/food/nicknames.js zoo_frontend/pages/food/nutrDef.js zoo_frontend/pages/food/units.js zoo_frontend/pages/home/index.js zoo_frontend/pages/index.jsx zoo_frontend/pages/kitchen/index.js zoo_frontend/pages/kitchen/prep/index.js zoo_frontend/pages/login/index.js zoo_frontend/pages/nutritionist/index.js zoo_frontend/pages/print/bin-label.js zoo_frontend/pages/print/index.js zoo_frontend/pages/print/labels.js zoo_frontend/pages/print/prep-sheet.js zoo_frontend/pages/profile/index.js zoo_frontend/pages/reports/cost-by-gl-code.js zoo_frontend/pages/reports/dept-cards.js zoo_frontend/pages/reports/dept-keeper-cards.js zoo_frontend/pages/reports/feeding-cost.js zoo_frontend/pages/reports/index.js zoo_frontend/pages/reports/prep-cards-table.js zoo_frontend/src/api/Animals.js zoo_frontend/src/api/Api.js zoo_frontend/src/api/BudgetIds.js zoo_frontend/src/api/CaseNotes.js zoo_frontend/src/api/DataSrc.js zoo_frontend/src/api/DeliveryContainers.js zoo_frontend/src/api/Departments.js zoo_frontend/src/api/DietChanges.js zoo_frontend/src/api/DietHistory.js zoo_frontend/src/api/DietPlans.js zoo_frontend/src/api/Diets.js zoo_frontend/src/api/Food.js zoo_frontend/src/api/FoodCategories.js zoo_frontend/src/api/FoodPrepTables.js zoo_frontend/src/api/FoodWeights.js zoo_frontend/src/api/LifeStages.js zoo_frontend/src/api/Locations.js zoo_frontend/src/api/NutData.js zoo_frontend/src/api/NutrDef.js zoo_frontend/src/api/PrepNotes.js zoo_frontend/src/api/RoleMappings.js zoo_frontend/src/api/Roles.js zoo_frontend/src/api/Species.js zoo_frontend/src/api/Subenclosures.js zoo_frontend/src/api/Units.js zoo_frontend/src/api/Users.js zoo_frontend/src/api/index.js zoo_frontend/src/components/ConfirmationDialog.jsx zoo_frontend/src/components/ErrorPage.jsx zoo_frontend/src/components/FormCheckbox.jsx zoo_frontend/src/components/Header.jsx zoo_frontend/src/components/KitchenView.jsx zoo_frontend/src/components/Notifications.jsx zoo_frontend/src/components/PrintPrepSheets/PrepSheetPrintOut.jsx zoo_frontend/src/components/PrintPrepSheets/PrintPrepSheets.jsx zoo_frontend/src/components/PrintPrepSheets/index.js zoo_frontend/src/components/ReactSingleSelect.jsx zoo_frontend/src/components/SidebarDrawer.jsx zoo_frontend/src/components/VirtualTable.jsx zoo_frontend/src/components/index.js zoo_frontend/src/getPageContext.js zoo_frontend/src/pages/PageAccess.js zoo_frontend/src/pages/admin/deliveryContainers/deliveryContainers.jsx zoo_frontend/src/pages/admin/deliveryContainers/deliveryContainers.styles.js zoo_frontend/src/pages/admin/deliveryContainers/index.js zoo_frontend/src/pages/admin/department/department.jsx zoo_frontend/src/pages/admin/department/department.styles.js zoo_frontend/src/pages/admin/department/index.js zoo_frontend/src/pages/admin/groupDiets/groupDiets.jsx zoo_frontend/src/pages/admin/groupDiets/groupDiets.styles.js zoo_frontend/src/pages/admin/groupDiets/index.js zoo_frontend/src/pages/admin/species/index.js zoo_frontend/src/pages/admin/species/species.jsx zoo_frontend/src/pages/admin/species/species.styles.js zoo_frontend/src/pages/admin/user/index.js zoo_frontend/src/pages/admin/user/user.jsx zoo_frontend/src/pages/admin/user/user.styles.js zoo_frontend/src/pages/diet/CaseNotesForm.jsx zoo_frontend/src/pages/diet/CurrentDiet.jsx zoo_frontend/src/pages/diet/DietChangeCard.jsx zoo_frontend/src/pages/diet/DietHistory.jsx zoo_frontend/src/pages/diet/DietPlanChangeDialog.jsx zoo_frontend/src/pages/diet/DietSelectDialog.jsx zoo_frontend/src/pages/diet/diet.jsx zoo_frontend/src/pages/diet/diet.styles.js zoo_frontend/src/pages/diet/dietForm.jsx zoo_frontend/src/pages/diet/dietHistoryList.jsx zoo_frontend/src/pages/diet/edit/edit.jsx zoo_frontend/src/pages/diet/edit/edit.styles.js zoo_frontend/src/pages/diet/edit/index.js zoo_frontend/src/pages/diet/index.js zoo_frontend/src/pages/diet/new/index.js zoo_frontend/src/pages/diet/new/new.jsx zoo_frontend/src/pages/diet/new/new.styles.js zoo_frontend/src/pages/diet/prepNotesForm.jsx zoo_frontend/src/pages/food/dataSrc/dataSrc.jsx zoo_frontend/src/pages/food/dataSrc/dataSrc.styles.js zoo_frontend/src/pages/food/dataSrc/index.js zoo_frontend/src/pages/food/edit/FoodWeightTable.jsx zoo_frontend/src/pages/food/edit/edit.jsx zoo_frontend/src/pages/food/edit/edit.styles.js zoo_frontend/src/pages/food/edit/index.js zoo_frontend/src/pages/food/food.jsx zoo_frontend/src/pages/food/food.styles.js zoo_frontend/src/pages/food/foodForm.jsx zoo_frontend/src/pages/food/index.js zoo_frontend/src/pages/food/new/index.js zoo_frontend/src/pages/food/new/new.jsx zoo_frontend/src/pages/food/new/new.styles.js zoo_frontend/src/pages/food/nicknames/index.js zoo_frontend/src/pages/food/nicknames/nicknames.jsx zoo_frontend/src/pages/food/nicknames/nicknames.styles.js zoo_frontend/src/pages/food/nutrDef/index.js zoo_frontend/src/pages/food/nutrDef/nutrDef.jsx zoo_frontend/src/pages/food/nutrDef/nutrDef.styles.js zoo_frontend/src/pages/food/units/index.js zoo_frontend/src/pages/food/units/units.jsx zoo_frontend/src/pages/food/units/units.styles.js zoo_frontend/src/pages/home/home.jsx zoo_frontend/src/pages/home/home.styles.js zoo_frontend/src/pages/home/index.js zoo_frontend/src/pages/kitchen/index.js zoo_frontend/src/pages/kitchen/kitchenHome.jsx zoo_frontend/src/pages/kitchen/kitchenHome.styles.js zoo_frontend/src/pages/kitchen/prep/index.js zoo_frontend/src/pages/kitchen/prep/kitchen.jsx zoo_frontend/src/pages/kitchen/prep/kitchen.styles.js zoo_frontend/src/pages/login/index.js zoo_frontend/src/pages/login/login.jsx zoo_frontend/src/pages/login/login.styles.js zoo_frontend/src/pages/nutritionist/admin.jsx zoo_frontend/src/pages/nutritionist/admin.styles.js zoo_frontend/src/pages/nutritionist/index.js zoo_frontend/src/pages/print/admin.jsx zoo_frontend/src/pages/print/admin.styles.js zoo_frontend/src/pages/print/bin-label/admin.jsx zoo_frontend/src/pages/print/bin-label/admin.styles.js zoo_frontend/src/pages/print/bin-label/index.js zoo_frontend/src/pages/print/index.js zoo_frontend/src/pages/print/labels/admin.jsx zoo_frontend/src/pages/print/labels/admin.styles.js zoo_frontend/src/pages/print/labels/index.js zoo_frontend/src/pages/print/prep-sheet/admin.jsx zoo_frontend/src/pages/print/prep-sheet/admin.styles.js zoo_frontend/src/pages/print/prep-sheet/index.js zoo_frontend/src/pages/profile/index.js zoo_frontend/src/pages/profile/profile.jsx zoo_frontend/src/pages/profile/profile.styles.js zoo_frontend/src/pages/reports/admin.jsx zoo_frontend/src/pages/reports/admin.styles.js zoo_frontend/src/pages/reports/cost-by-gl-code/admin.jsx zoo_frontend/src/pages/reports/cost-by-gl-code/admin.styles.js zoo_frontend/src/pages/reports/cost-by-gl-code/index.js zoo_frontend/src/pages/reports/dept-cards/admin.jsx zoo_frontend/src/pages/reports/dept-cards/admin.styles.js zoo_frontend/src/pages/reports/dept-cards/index.js zoo_frontend/src/pages/reports/dept-keeper-cards/admin.jsx zoo_frontend/src/pages/reports/dept-keeper-cards/admin.styles.js zoo_frontend/src/pages/reports/dept-keeper-cards/index.js zoo_frontend/src/pages/reports/feeding-cost/admin.jsx zoo_frontend/src/pages/reports/feeding-cost/admin.styles.js zoo_frontend/src/pages/reports/feeding-cost/index.js zoo_frontend/src/pages/reports/index.js zoo_frontend/src/pages/reports/prep-cards-table/admin.jsx zoo_frontend/src/pages/reports/prep-cards-table/admin.styles.js zoo_frontend/src/pages/reports/prep-cards-table/index.js zoo_frontend/src/static/LocalStorage.js zoo_frontend/src/static/Roles.js zoo_frontend/src/util/AuthProvider.jsx zoo_frontend/src/util/PageLayout.jsx zoo_frontend/src/util/TableColumnHelper.js zoo_frontend/src/util/WithPropsChecker.jsx zoo_frontend/src/util/camelToNorm.js zoo_frontend/src/util/withAuth.jsx
  • nicknames.jsx

  • ¶
    import React, { Component } from 'react';
    import PropTypes from 'prop-types';
    import MaterialTable from 'material-table';
    import Edit from '@material-ui/icons/Edit';
    import {
      TextField, Button, Dialog, DialogTitle, DialogContent, DialogActions,
    } from '@material-ui/core';
    
    import TableColumnHelper from '../../../util/TableColumnHelper';
    
    import FoodModelAPI from '../../../../../zoo_api/common/models/FOOD.json';
    
    import { Food as FoodAPI } from '../../../api';
    import { hasAccess, Food } from '../../PageAccess';
    import { Notifications } from '../../../components';
    
    export default class extends Component {
      /**
       * Server side data retrieval
       */
      static async getInitialProps({ authToken }) {
  • ¶

    api helpers on server side

        const api = new FoodAPI(authToken);
  • ¶

    server side grab all data for list view

        const res = await api.getFood().catch((err) => ({ foodItems: [{ err: true, msg: err }] }));
    
        return { allFood: res.data };
      }
    
      static propTypes = {
        token: PropTypes.string,
        account: PropTypes.object.isRequired,
  • ¶

    classes: PropTypes.object.isRequired,

        allFood: PropTypes.array.isRequired,
      }
    
      static defaultProps = {
        token: '',
      }
    
      constructor(props) {
        super(props);
    
        this.state = {
          allFood: props.allFood,
          editDialogOpen: false,
          dialogRow: false,
          dirty: false,
        };
    
        const keys = Object.keys(FoodModelAPI.properties);
        const FoodColumns = {};
  • ¶

    flip columns around to make nickname appear second

        keys.reverse().forEach((key) => { FoodColumns[key] = null; });
        const ignoredFoodWeightColumns = ['foodId', 'sciName', 'manufacturerName', 'costG', 'budgetId', 'category', 'usdaFoodGroupDesc', 'dry', 'meat', 'preChop', 'preBag', 'active'];
        const renamedFoodWeightColumns = {
          ohdzName: 'Nickname',
          food: 'Food name',
        };
    
        this.preppedFoodColumns = TableColumnHelper([FoodColumns], ignoredFoodWeightColumns, renamedFoodWeightColumns);
    
        this.clientFoodAPI = new FoodAPI(this.props.token);
        this.notificationBar = React.createRef();
      }
    
      handleNickNameChange = (rowData) => {
        this.setState({ editDialogOpen: true, dialogRow: { ...rowData } });
      }
    
      async handleDialogSave() {
        if (!this.state.dialogRow.ohdzName) {
          this.notificationBar.showNotification('error', 'nickname must be present.');
          return; // keep it open and let them fix
        }
        const updates = { ohdzName: this.state.dialogRow.ohdzName };
        const id = this.state.dialogRow.foodId;
        const res = await this.clientFoodAPI.updateFood(id, updates);
        if (res.data) {
          this.setState((prevState) => {
            const newFoodData = [...prevState.allFood.map((item) => {
              if (item.foodId !== res.data.foodId) {
                return item;
              }
              const updatedRow = item;
              Object.assign(updatedRow, res.data);
              return updatedRow;
            })];
            return {
              allFood: newFoodData,
              editDialogOpen: false,
              dialogRow: {},
              dirty: false,
            };
          });
        }
      }
    
      handleCancelDialog() {
        this.setState({ editDialogOpen: false, dialogRow: {}, dirty: false });
      }
    
      render() {
        const { role } = this.props.account;
        return (
          <div>
            {this.state.editDialogOpen &&
              <Dialog
                key="editDialog"
                open={this.state.editDialogOpen}
                onClose={this.handleClose}
                aria-labelledby="form-dialog-title"
                fullWidth
              >
                <DialogTitle id="form-dialog-title">Edit Food Nickname</DialogTitle>
                <DialogContent>
                  <TextField
                    id="nickname"
                    label="Nickname"
                    value={this.state.dialogRow.ohdzName}
                    onChange={(evt) => { const newVal = evt.target.value; this.setState((prevState) => ({ dialogRow: { ...prevState.dialogRow, ohdzName: newVal }, dirty: true })); }}
                    margin="normal"
                    fullWidth
                  />
                </DialogContent>
                <DialogActions>
                  <Button onClick={() => this.handleCancelDialog()} color="primary">
                    Cancel
                  </Button>
                  <Button disabled={!this.state.dirty} onClick={() => this.handleDialogSave()} color="primary">
                    Save
                  </Button>
                </DialogActions>
              </Dialog>
            }
            <MaterialTable
              title="Food Nicknames"
              data={this.state.allFood}
              columns={this.preppedFoodColumns}
              options={{
                pageSize: 10,
                actionsColumnIndex: 0,
                emptyRowsWhenPaging: false,
              }}
              actions={[
                (rowData) => ({
                  icon: () => <Edit />,
                  onClick: () => this.handleNickNameChange(rowData),
                  tooltip: 'Edit Nickname',
                  disabled: !hasAccess(role, Food.nicknames.roles),
                }),
              ]}
            />
            <Notifications
              ref={this.notificationBar}
            />
          </div>
        );
      }
    }